package Compilador2014;

public class Token {

	private String simbolo;
	private String lexema;
	private int fila;
	private int columna;
	private char idToken;//se trata de la letra del token
	
	public Token () {
		simbolo = "";
		lexema = "";
		fila = 0;
		columna = 0;
		idToken = ' ';
	}
	
	public Token (String lexema, String simbolo, int fila, int columna) {
		this.simbolo = simbolo;
		this.lexema = lexema;
		this.fila = fila;
		this.columna = columna;
		idToken = asignarLetra (simbolo);
	}
	
	public Token (String cadena) {
		this.lexema = cadena;
		if (lexema.equals("Inicio_programa"))
			simbolo = "Inicio_programa";
		else if (lexema.equals("fin_programa."))
			simbolo = "fin_programa.";
		else if (lexema.equals("int"))
			simbolo = "int";
		else if (lexema.equals("string"))
			simbolo = "string";
		else if (lexema.equals("bool"))
			simbolo = "bool";
		else if (lexema.equals("real"))
			simbolo = "real";
		else if (lexema.equals("if"))
			simbolo = "if";
		else if (lexema.equals("else"))
			simbolo = "else";
		else if (lexema.equals("while"))
			simbolo = "while";
		else if (lexema.equals("printf"))
			simbolo = "printf";
		else if (lexema.equals("scanf"))
			simbolo = "scanf";
		else if (lexema.equals("true"))
			simbolo = "true";
		else if (lexema.equals("false"))
			simbolo = "false";
		else if (lexema.charAt(0)=='"' && lexema.charAt(lexema.length()-1)=='"')
			simbolo = "literal";
		else if (lexema.equals(":="))
			simbolo = ":=";
		else if (lexema.equals("="))
			simbolo = "=";
		else if (lexema.equals("++"))
			simbolo = "++";
		else if (lexema.equals(">") || lexema.equals(">=") || lexema.equals("<") ||
				 lexema.equals("==") || lexema.equals("!="))
			simbolo = "oper_logico";
		else if (lexema.equals("<="))
			simbolo = "<=";
		else if (lexema.equals("+") || lexema.equals("-") || lexema.equals("*") ||
				lexema.equals("/") || lexema.equals("mod") || lexema.equals("div"))
			simbolo = "oper_arit";
		else if (lexema.equals("{"))
			simbolo = "{";
		else if (lexema.equals("}"))
			simbolo = "}";
		else if (lexema.equals("("))
			simbolo = "(";
		else if (lexema.equals(")"))
			simbolo = ")";
		else if (lexema.equals(")"))
			simbolo = ")";
		else if (lexema.equals(","))
			simbolo = ",";
		else if (lexema.equals(";"))
			simbolo = ";";
		else if (esNumerico(lexema)) {
			System.out.println("lexema = "+lexema+" simbolo = "+simbolo+" no es numerico");
			simbolo = "num";	
		}
		else {
			System.out.println("lexema = "+lexema+" simbolo = "+simbolo+" si es numerico");
			simbolo = "id";
		}
		fila = 0;
		columna = 0;
		idToken = asignarLetra (simbolo);
	}
	
	public Token (char idToken) {
		switch (idToken) {
		case 'a': 
			lexema = "Inicio_programa";
			simbolo = "Inicio_programa";
			break;
		case 'b': 
			lexema = "fin_programa.";
			simbolo = "fin_programa.";
			break;
		case 'c': 
			lexema = "int";
			simbolo = "int";
			break;
		case 'd': 
			lexema = "string";
			simbolo = "string";
			break;
		case 'e': 
			lexema = "bool";
			simbolo = "bool";
			break;
		case 'f': 
			lexema = "real";
			simbolo = "real";
			break;
		case 'g': 
			lexema = "if";
			simbolo = "if";
			break;
		case 'h': 
			lexema = "else";
			simbolo = "else";
			break;
		case 'i': 
			lexema = "while";
			simbolo = "while";
			break;
		case 'j': 
			lexema = "printf";
			simbolo = "printf";
			break;
		case 'k': 
			lexema = "scanf";
			simbolo = "scanf";
			break;
		case 'l': 
			lexema = "true";
			simbolo = "true";
			break;
		case 'm': 
			lexema = "false";
			simbolo = "false";
			break;
		case 'n': 
			lexema = "id";
			simbolo = "id";
			break;
		case 'o': 
			lexema = "num";
			simbolo = "num";
			break;
		case 'p': 
			lexema = "literal";
			simbolo = "literal";
			break;
		case 'q': 
			lexema = ":=";
			simbolo = ":=";
			break;
		case 'r': 
			lexema = "=";
			simbolo = "=";
			break;
		case 's': 
			lexema = "++";
			simbolo = "++";
			break;
		case 't': 
			lexema = "oper_logico";
			simbolo = "oper_logico";
			break;
		case 'u': 
			lexema = "oper_arit";
			simbolo = "oper_arit";
			break;
		case 'v': 
			lexema = "<=";
			simbolo = "<=";
			break;
		case 'w': 
			lexema = "for";
			simbolo = "for";
			break;
		}
		fila = 0;
		columna = 0;
		this.idToken = idToken;
	}
	
	public boolean esNumerico (String cad) {
		for (int i=0; i<cad.length(); i++) {
			if (!Character.isDigit(cad.charAt(i)) || cad.charAt(i)!='.')
				return false;
		}
		return true;
	}
	
	public char asignarLetra (String cadena) {
		if (cadena.equals("Inicio_programa"))
			return 'a';
		if (cadena.equals("fin_programa."))
			return 'b';
		if (cadena.equals("int"))
			return 'c';
		if (cadena.equals("string"))
			return 'd';
		if (cadena.equals("bool"))
			return 'e';
		if (cadena.equals("real"))
			return 'f';
		if (cadena.equals("if"))
			return 'g';
		if (cadena.equals("else"))
			return 'h';
		if (cadena.equals("while"))
			return 'i';
		if (cadena.equals("for"))
			return 'w';
		if (cadena.equals("printf"))
			return 'j';
		if (cadena.equals("scanf"))
			return 'k';
		if (cadena.equals("true"))
			return 'l';
		if (cadena.equals("false"))
			return 'm';
		//if (cadena.charAt(0)=='\"' && cadena.charAt(cadena.length()-1)=='\"')
		if (cadena.equals("literal"))
			return 'p';
		if (cadena.equals(":="))
			return 'q';
		if (cadena.equals("="))
			return 'r';
		if (cadena.equals("++"))
			return 's';
		//if (cadena.equals(">") || cadena.equals(">=") || cadena.equals("<") ||
			//	 cadena.equals("==") || cadena.equals("!="))
		if (cadena.equals("oper_logico"))
			return 't';
		if (cadena.equals("<="))
			return 'v';
		//if (cadena.equals("+") || cadena.equals("-") || cadena.equals("*") ||
			//	cadena.equals("/") || cadena.equals("mod") || cadena.equals("div"))
		if (cadena.equals("oper_arit"))
			return 'u';
		if (cadena.equals("{"))
			return  '{';
		if (cadena.equals("}"))
			return '}';
		if (cadena.equals("("))
			return '(';
		if (cadena.equals(")"))
			return ')';
		if (cadena.equals(","))
			return ',';
		if (cadena.equals(";"))
			return ';';
		//if (esNumerico(cadena))
		if (cadena.equals("num"))
			return 'o';
		if (cadena.equals("id"))
			return 'n';
		return '#';
	}

	public String getSimbolo() {
		return simbolo;
	}

	public void setSimbolo(String simbolo) {
		this.simbolo = simbolo;
	}

	public String getLexema() {
		return lexema;
	}

	public void setLexema(String lexema) {
		this.lexema = lexema;
	}

	public int getFila() {
		return fila;
	}

	public void setFila(int fila) {
		this.fila = fila;
	}

	public int getColumna() {
		return columna;
	}

	public void setColumna(int columna) {
		this.columna = columna;
	}

	public char getIdToken() {
		return idToken;
	}

	public void setIdToken(char idToken) {
		this.idToken = idToken;
	}
	
}
